package com.example.ovulationperiodtracker.utils;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.List;

/**
 * 月经周期平均值计算
 */
public class MenstrualCycleCalculator {

    // 计算前n次月经周期的平均值
    public static int calculateAverageOfLastNCycles(List<LocalDate> allJingStart, int n) {
        // 检查输入合法性
        if (allJingStart == null || allJingStart.size() < 2) {
            return 0; // 至少需要2个日期才能计算1个周期
        }

        // 确保n不超过可计算的最大周期数
        int maxPossibleCycles = allJingStart.size() - 1;
        int actualN = Math.min(n, maxPossibleCycles);

        if (actualN <= 0) {
            return 0; // 没有足够的周期可计算
        }

        long totalDays = 0;

        // 计算前n次的周期（由于集合按降序排列，从第一个元素开始取）
        for (int i = 0; i < actualN; i++) {
            LocalDate current = allJingStart.get(i);
            LocalDate next = allJingStart.get(i + 1);

            // 计算两个相邻月经开始日期间的天数
            long daysBetween = ChronoUnit.DAYS.between(next, current);
            totalDays += daysBetween;
        }

        // 计算平均值
        return (int) totalDays / actualN;
    }

    /**
     * 计算最近n次月经周期中的最长周期
     */
    public static int calculateMaxCycle(List<LocalDate> allJingStart, int n) {
        // 检查输入合法性
        if (allJingStart == null || allJingStart.size() < 2) {
            return 0; // 数据不足，无法计算
        }

        // 确保n不超过可计算的最大周期数
        int maxPossibleCycles = allJingStart.size() - 1;
        int actualN = Math.min(n, maxPossibleCycles);

        if (actualN <= 0) {
            return 0; // 没有足够的周期可计算
        }

        long maxCycle = Long.MIN_VALUE;

        // 查找最近actualN次中的最长周期
        for (int i = 0; i < actualN; i++) {
            LocalDate current = allJingStart.get(i);
            LocalDate next = allJingStart.get(i + 1);
            long daysBetween = ChronoUnit.DAYS.between(next, current);

            if (daysBetween > maxCycle) {
                maxCycle = daysBetween;
            }
        }

        return (int) maxCycle;
    }

    /**
     * 计算最近n次月经周期中的最短周期
     */
    public static int calculateMinCycle(List<LocalDate> allJingStart, int n) {
        // 检查输入合法性
        if (allJingStart == null || allJingStart.size() < 2) {
            return 0; // 数据不足，无法计算
        }

        // 确保n不超过可计算的最大周期数
        int maxPossibleCycles = allJingStart.size() - 1;
        int actualN = Math.min(n, maxPossibleCycles);

        if (actualN <= 0) {
            return 0; // 没有足够的周期可计算
        }

        long minCycle = Long.MAX_VALUE;

        // 查找最近actualN次中的最短周期
        for (int i = 0; i < actualN; i++) {
            LocalDate current = allJingStart.get(i);
            LocalDate next = allJingStart.get(i + 1);
            long daysBetween = ChronoUnit.DAYS.between(next, current);

            if (daysBetween < minCycle) {
                minCycle = daysBetween;
            }
        }

        return (int) minCycle;
    }
}
